package com.xu.demob.service;

import com.baidu.aip.ocr.AipOcr;
import okhttp3.OkHttpClient;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import okhttp3.*;
import org.json.JSONObject;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Base64;

import java.io.IOException;
import java.util.HashMap;
import java.util.concurrent.ExecutionException;

@Service
public class BaiduOcrService {

    private AipOcr client;

    private static final String API_KEY = "PaySXvaHBP5q8xkLogMX6C5j";
    private static final String SECRET_KEY = "Q8gWNIKAhjCmlAwj9hjaVOvx91QgadIW";
    private static final String TABLE_OCR_URL = "https://aip.baidubce.com/rest/2.0/ocr/v1/table";


    public BaiduOcrService(@Value("${baidu.ocr.appId}") String appId,
                           @Value("${baidu.ocr.apiKey}") String apiKey,
                           @Value("${baidu.ocr.secretKey}") String secretKey) {
        client = new AipOcr(appId, apiKey, secretKey);
        // Optional: 设置网络连接参数
        client.setConnectionTimeoutInMillis(2000);
        client.setSocketTimeoutInMillis(60000);
    }

    /**
     * 识别图像中的车牌号码。
     *
     * 该方法通过调用客户端接口，传入图像路径，来识别图像中的车牌号码。
     * 它返回一个包含识别结果的JSON对象，结果包括车牌号码等信息。
     *
     * @param imagePath 图像文件的路径，用于车牌识别。
     * @return 返回一个JSON字符串，包含车牌识别的结果。
     */
    public String recognizeLicensePlate(String imagePath) {
        // 调用客户端的车牌识别接口，传入图像路径和空的参数映射。
        // 调用车牌识别接口
        JSONObject res = client.plateLicense(imagePath, new HashMap<String, String>());
        // 将JSON对象转换为格式化的字符串返回。
        return res.toString(2);  // 格式化输出
    }

    /**
     * 识别图像中的车牌号码。
     *
     * 该方法通过调用客户端接口，传入图像路径，来识别图像中的车牌号码。
     * 它返回一个包含识别结果的JSON对象，结果包括车牌号码等信息。
     *
     * @param imagePath 图像文件的路径，用于车牌识别。
     * @return 返回一个JSON字符串，包含车牌识别的结果。
     */
    public JSONObject numbers(byte[] imagePath) {
        // 调用客户端的车牌识别接口，传入图像路径和空的参数映射。
        // 调用车牌识别接口
        JSONObject res = client.numbers(imagePath, new HashMap<String, String>());
        // 将JSON对象转换为格式化的字符串返回。
        return res;  // 格式化输出
    }


    /**
     * 识别身份证图片中的信息。
     * 通过调用AI识别服务，对指定的身份证图片进行正面或背面的信息识别。
     *
     * @param imagePath 身份证图片的文件路径，可以是本地文件路径或远程URL。
     * @param idCardSide 身份证的面，"front"表示正面，"back"表示背面。
     * @return 识别结果的JSON字符串，包含识别出的身份证信息。
     */
    public String recognizeIdCard(String imagePath, String idCardSide) {
        // 初始化请求参数，指定AI服务需要的方向检测功能。
        // 参数idCardSide：身份证正面为"front"，身份证背面为"back"
        HashMap<String, String> options = new HashMap<>();
        options.put("detect_direction", "true");

        // 调用客户端对象的idcard方法，传入图片路径、面和选项，获取识别结果。
        // 调用身份证识别接口
        JSONObject res = client.idcard(imagePath, idCardSide, options);
        // 将识别结果转换为格式化的JSON字符串返回。
        return res.toString(2);  // 格式化输出
    }

    /**
     * 调用自定义模板OCR识别接口
     * @param imagePath 图片路径
     * @param templateSign 自定义模板的签名
     * @return 识别结果的JSON字符串
     */
    public String recognizeCustomTemplate(String imagePath, String templateSign) {
        HashMap<String, String> options = new HashMap<>();
        options.put("templateSign", templateSign);

        JSONObject res = client.custom(imagePath, options);
        return res.toString(2); // 格式化输出
    }

    /**
     * 调用自定义模板OCR识别接口
     * @param bytes
     * @param templateSign 自定义模板的签名
     * @return 识别结果的JSON字符串
     */
    public String recognizeCustomTemplate2(byte[] bytes, String templateSign) {
        HashMap<String, String> options = new HashMap<>();
        options.put("classifierId", "1");

        JSONObject res = client.custom(bytes, options);
        return res.toString(2); // 格式化输出
    }

    /**
     * OCR识别接口
     * @param base64String
     * @return 识别结果的JSON字符串
     */
    public String generalBasic(String base64String) {
        HashMap<String, String> options = new HashMap<>();

        JSONObject res = client.basicGeneral(base64String, options);
        return res.toString(2); // 格式化输出
    }


    /**
     * 调用自定义模板OCR识别接口
     * @param bytes
//     * @param templateSign 自定义模板的签名
     * @return 识别结果的JSON字符串
     */
    public String table(byte[] bytes, HashMap<String, String> options) {
        // 调用表格识别接口
        JSONObject jsonObject = client.tableRecognitionAsync(bytes, options);
        return jsonObject.toString(2); // 格式化输出
    }

    // 获取 Access Token
    public String getAccessToken() throws IOException {
        OkHttpClient client = new OkHttpClient();
        String authUrl = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials"
                + "&client_id=" + API_KEY + "&client_secret=" + SECRET_KEY;

        Request request = new Request.Builder().url(authUrl).build();
        Response response = client.newCall(request).execute();
        String json = response.body().string();

        JSONObject jsonObject = new JSONObject(json);
        return jsonObject.getString("access_token");
    }

    // 表格识别方法
    public String table(String bytes) throws IOException {
        OkHttpClient client = new OkHttpClient();
        String accessToken = getAccessToken();

        // 读取图片并进行 Base64 编码
//        byte[] imgData = Files.readAllBytes(Paths.get(bytes));
//        String imgStr = Base64.getEncoder().encodeToString(imgData);

        // 构建请求体
        RequestBody requestBody = new FormBody.Builder()
                .add("image", bytes)
                .add("result_type", "json") // 返回 json 格式的结果
                .build();

        // 构建请求
        Request request = new Request.Builder()
                .url(TABLE_OCR_URL + "?access_token=" + accessToken)
                .post(requestBody)
                .addHeader("Content-Type", "application/x-www-form-urlencoded")
                .build();

        // 发送请求并获取响应
        Response response = client.newCall(request).execute();
        return response.body().string();
    }


}
